package com.zenithmind.task.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 任务状态枚举
 * 遵循面向对象设计原则：
 * 1. 开闭原则：通过策略模式支持状态行为扩展
 * 2. 单一职责原则：专注于状态定义和行为
 * 3. 封装原则：提供状态判断和转换方法
 *
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Getter
@AllArgsConstructor
public enum TaskStatus {

    /**
     * 待办
     */
    TODO(1, "待办", "todo"),

    /**
     * 进行中
     */
    IN_PROGRESS(2, "进行中", "in_progress"),

    /**
     * 已完成
     */
    COMPLETED(3, "已完成", "completed"),

    /**
     * 已取消
     */
    CANCELLED(4, "已取消", "cancelled"),

    /**
     * 已暂停
     */
    PAUSED(5, "已暂停", "paused");

    /**
     * 状态码
     */
    private final Integer code;

    /**
     * 状态名称
     */
    private final String name;

    /**
     * 状态标识
     */
    private final String key;

    // 缓存映射，提高查询性能
    private static final Map<Integer, TaskStatus> CODE_MAP =
        Arrays.stream(values()).collect(Collectors.toMap(TaskStatus::getCode, Function.identity()));

    private static final Map<String, TaskStatus> KEY_MAP =
        Arrays.stream(values()).collect(Collectors.toMap(TaskStatus::getKey, Function.identity()));

    /**
     * 根据状态码获取枚举
     *
     * @param code 状态码
     * @return 任务状态枚举
     */
    public static TaskStatus getByCode(Integer code) {
        return CODE_MAP.get(code);
    }

    /**
     * 根据状态标识获取枚举
     *
     * @param key 状态标识
     * @return 任务状态枚举
     */
    public static TaskStatus getByKey(String key) {
        return KEY_MAP.get(key);
    }

    /**
     * 检查是否为完成状态
     * 
     * @return 是否完成
     */
    public boolean isCompleted() {
        return this == COMPLETED;
    }

    /**
     * 检查是否为进行中状态
     * 
     * @return 是否进行中
     */
    public boolean isInProgress() {
        return this == IN_PROGRESS;
    }

    /**
     * 检查是否为活跃状态（待办或进行中）
     * 
     * @return 是否活跃
     */
    public boolean isActive() {
        return this == TODO || this == IN_PROGRESS;
    }

    /**
     * 检查是否为终止状态（已完成、已取消）
     *
     * @return 是否终止
     */
    public boolean isTerminated() {
        return this == COMPLETED || this == CANCELLED;
    }

    /**
     * 检查是否可以转换到目标状态
     *
     * @param target 目标状态
     * @return 是否可以转换
     */
    public boolean canTransitionTo(TaskStatus target) {
        if (target == null) {
            return false;
        }

        switch (this) {
            case TODO:
                return target == IN_PROGRESS || target == CANCELLED;
            case IN_PROGRESS:
                return target == COMPLETED || target == PAUSED || target == CANCELLED;
            case COMPLETED:
                return false; // 已完成的任务不能转换到其他状态
            case CANCELLED:
                return target == TODO; // 可以重新激活
            case PAUSED:
                return target == IN_PROGRESS || target == CANCELLED;
            default:
                return false;
        }
    }

    /**
     * 获取所有活跃状态
     *
     * @return 活跃状态列表
     */
    public static TaskStatus[] getActiveStatuses() {
        return Arrays.stream(values())
                    .filter(TaskStatus::isActive)
                    .toArray(TaskStatus[]::new);
    }

    /**
     * 获取所有终止状态
     *
     * @return 终止状态列表
     */
    public static TaskStatus[] getTerminatedStatuses() {
        return Arrays.stream(values())
                    .filter(TaskStatus::isTerminated)
                    .toArray(TaskStatus[]::new);
    }

    /**
     * 验证状态转换
     *
     * @param from 源状态
     * @param to 目标状态
     * @return 是否可以转换
     */
    public static boolean validateTransition(TaskStatus from, TaskStatus to) {
        if (from == null || to == null) {
            return false;
        }
        return from.canTransitionTo(to);
    }

    /**
     * 获取状态的CSS样式类
     *
     * @return CSS样式类
     */
    public String getCssClass() {
        switch (this) {
            case TODO:
                return "status-todo";
            case IN_PROGRESS:
                return "status-in-progress";
            case COMPLETED:
                return "status-completed";
            case CANCELLED:
                return "status-cancelled";
            case PAUSED:
                return "status-paused";
            default:
                return "status-unknown";
        }
    }

    /**
     * 获取状态的颜色代码
     *
     * @return 颜色代码
     */
    public String getColorCode() {
        switch (this) {
            case TODO:
                return "#1890ff"; // 蓝色
            case IN_PROGRESS:
                return "#52c41a"; // 绿色
            case COMPLETED:
                return "#722ed1"; // 紫色
            case CANCELLED:
                return "#f5222d"; // 红色
            case PAUSED:
                return "#fa8c16"; // 橙色
            default:
                return "#d9d9d9"; // 灰色
        }
    }
}
